<?php
class Bline extends MY_Controller {
	// Modelos usados en las funciones del controlador
	var $modelBusinessLineDAO = 'Business_line_dao';
	var $modelBusinessLineDTO = 'Business_line_dto';

	var $modelOutcomeDAO = 'Outcome_dao';

	var $modelRoundDAO = 'Round_dao';
	var $modelRoundDTO = 'Round_dto';
	
	// Vistas utilizadas en las funciones del controlador
	var $editionView = 'business_line/bline_new_view';
	var $gridView = 'business_line/bline_all_view';
	var $resultMessageView = 'templates/result_msg';
	
	// Vista a la que debe redirigirse al guardar/borrar una bline
	var $redirectMethod = 'information/getAll';
	
	// Datos para pasar a las vistas
	var $pageTitle = 'Business lines';
	
	private $controllerName = 'bline';
	
	public function __construct()
    {
    	parent::__construct();
		
		// Éstos modelos los cargo al inicio ya que los utilizo en la mayoría de los métodos
		$this->load->model("$this->modelBusinessLineDAO", 'B_line_dao');
		$this->load->model("$this->modelBusinessLineDTO", 'B_line_dto');
		
		$this->resultMessageView = $this->template->getResultMessageView();
	}
	
	private function _loadRoundModels()
	{
		$this->load->model("$this->modelRoundDAO", 'Round_dao');
		$this->load->model("$this->modelRoundDTO", 'Round_dto');
	}

	public function addBusinessLine()
	{
		$this->pageTitle = 'New Business Line';
		$this->_loadEditionForm(0, 'addBusinessLine');
	}
	
	public function editBusinessLine($idBLine)
	{
		$this->pageTitle = 'Edit Business Line';
		$this->_loadEditionForm($idBLine, 'editBusinessLine');
	}
	
	private function _loadEditionForm($idBLine = 0, $function)
	{	
		// La acción sólo puede realizarla un administrador. Controlo los permisos antes de continuar
		if(parent::permitted($this->controllerName, $function)) {
			// Obtengo la línea de negocio que se desea editar y mostrar en la vista
			$b_line = $this->B_line_dao->obtenerObjetoPorID($idBLine);
			$dataView['business_line'] = $b_line;

			$this->_loadRoundModels();
			if($b_line->idRound != 0) $rounds_bl = array($this->Round_dao->obtenerObjetoPorID($b_line->idRound));
			else $rounds_bl = $this->Round_dao->obtenerDatos();
			$dataView['rounds'] = $rounds_bl;

			$this->load->view($this->editionView, $dataView);
		}
		else { 
			parent::loadForbiddenView();
		}
	}
	
	public function saveBusinessLine()
	{	
		$this->pageTitle = 'Save BusinessLine';
	
		// Se agregan las validaciones a los campos que corresponde
		$this->form_validation->set_rules('nameBL','Business Line Name','trim|required|max_length[250]|xss_clean|callback_validarNombre');
		$this->form_validation->set_rules('idRoundBL','Round','required');
		
		$id = is_numeric($this->input->post('idBL')) ? $this->input->post('idBL') : 0;
        if ($this->form_validation->run() == FALSE)
        {
			// Alguno de los campos no pasó la validación anterior, vuelvo a mostrar el fomulario de edición	
			$this->_loadEditionForm($id, 'addBusinessLine');
        }else{ // La validación del formulario fue exitosa, puedo continuar y guardar los datos
			if($this->nombreDisponible($this->input->post('nameBL'), $this->input->post('idRoundBL'))) {
				// Obtengo los datos desde el formulario y los asigno al modelo
				if($id == 0) {
					$bline = new Business_line_dto();
					$bline->id = 0;
				}
				else $bline = $this->B_line_dao->obtenerObjetoPorID($id);
				$bline->name = $this->input->post('nameBL');
				$bline->idRound = $this->input->post('idRoundBL');

				$result = $this->B_line_dao->guardar($bline);
				
				// Valido si ocurrió algún error al intentar guardar
				$errores = $result['error_msg'];
				$dataView['result'] = $errores;
				
				if($errores == '') { // Si no hubo error y se guardó la nueva línea, continúo
					redirect($this->redirectMethod);
				}
				else parent::_loadViews("$this->resultMessageView", $dataView);
			}
			else {
				$this->form_validation->set_message('nameBL', 'This Business Line name already exists');			
				$this->_loadEditionForm($id, 'addBusinessLine');
			}
        }
	}
	
	public function deleteBusinessLine($idBLine)
	{
		// La acción sólo puede realizarla un administrador. Controlo los permisos antes de continuar
		if(parent::permitted($this->controllerName, 'deleteBusinessLine')) {
			$this->pageTitle = 'Delete Business Line';
			
			if($this->validarEliminacion($idBLine)) {
				$result = $this->B_line_dao->borrar($idBLine);
					
				// Valido si ocurrió algún error al intentar borrar
				$errores = $result['error_msg'];
				$dataView['result'] = $errores;
				
				if($errores == '') redirect($this->redirectMethod);
				else parent::_loadViews("$this->resultMessageView", $dataView);
			}
			else {
				$dataView['result'] = 'Can not delete a Business Line with associated Outcomes.';
				parent::_loadViews("$this->resultMessageView", $dataView);
			}
		}
		else { 
			parent::loadForbiddenView();
		}
	}

	public function permittedDelete()
	{
		$idBL = $this->input->post('item');
		
		if(!$idBL) echo FALSE;
        else {
        	if($this->validarEliminacion($idBL)) echo TRUE;
        	else echo FALSE;
        }
	}

	private function validarEliminacion($idBL)
	{
		$this->load->model($this->modelOutcomeDAO);

    	// Compruebo si la BL tiene Outcomes asociadas
		$condiciones = array('idBusinessLine' => $idBL);
		$consulta = $this->Outcome_dao->obtenerObjetos($condiciones);
		if (sizeof($consulta) == 0) {
			 return TRUE;
		}
		else return FALSE;
	}

	public function existName()
	{
		$name = $this->input->post('item');
		$idParent = $this->input->post('idParent');
		
		if(!$name) echo FALSE;
        else {
			if(!$this->nombreDisponible($name, $idParent)) echo TRUE;
			else echo FALSE;
        }
	}

	public function nombreDisponible($name, $idParent)
	{
		$name = trim($name);
		$condiciones = array('name' => "$name",
							 'idRound' => $idParent);
		$consulta = $this->B_line_dao->obtenerDatos($condiciones);
		if (sizeof($consulta) > 0) {
			 return FALSE; // El nombre no es válido porque ya hay otro con ese nombre
		}
		else return TRUE;
	}
}